<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Structure editor</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Structure_editor"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Structure_editor rootpage-Structure_editor skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Structure editor</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><p>A <b>structure editor</b>, also <b>structured editor</b> or <b>projectional editor</b>, is any document editor that is cognizant of the document's underlying <a href="Structure" title="Structure">structure</a>. Structure editors can be used to edit hierarchical or <a href="Markup_language" title="Markup language">marked up</a> <a href="https://en.wiktionary.org/wiki/text" class="extiw external" title="wikt:text">text</a>, <a href="Computer_program" title="Computer program">computer programs</a>, <a href="Diagram" title="Diagram">diagrams</a>, <a href="Chemical_formula" title="Chemical formula">chemical formulas</a>, and any other type of content with clear and well-defined structure. In contrast, a <a href="Text_editor" title="Text editor">text editor</a> is any document editor used for editing plain <a href="Text_file" title="Text file">text files</a>.
</p><p>Typically, the benefits of text and structure editing are combined in the <a href="User_interface" title="User interface">user interface</a> of a single hybrid tool. For example, <a href="Emacs" title="Emacs">Emacs</a> is fundamentally a text editor, but supports the manipulation of words, sentences, and paragraphs as structures that are inferred from the text. Conversely, <a href="Dreamweaver" class="mw-redirect" title="Dreamweaver">Dreamweaver</a> is fundamentally a structure editor for marked up web documents, but supports the display and manipulation of raw <a href="HTML" title="HTML">HTML</a> text as well. Similarly, <a href="Molecule_editor" title="Molecule editor">molecule editors</a> typically support both graphical and textual input. Structure editing predominates when content is <a href="Graphics" title="Graphics">graphical</a> and textual representations are awkward, e.g., <a href="Computer-aided_design" title="Computer-aided design">CAD</a> systems and <a href="PowerPoint" class="mw-redirect" title="PowerPoint">PowerPoint</a>. Text editing predominates when content is largely devoid of structure, e.g., text fields in web forms. <a href="WYSIWYG" title="WYSIWYG">WYSIWYG</a> <a href="Word_processors" class="mw-redirect" title="Word processors">word processing systems</a> such as <a href="Microsoft_Word" title="Microsoft Word">Word</a>, which appear to edit formatted text directly, are essentially structure editors for the underlying marked-up text.
</p><p>In <a href="Linguistics" title="Linguistics">linguistics</a>, <a href="Syntax" title="Syntax">syntax</a> is the study of the structure of grammatical utterances, and accordingly <b>syntax-directed editor</b> is a synonym for structure editor. <b>Language-based editor</b> and <b>language-sensitive editor</b> are also synonyms. A language-based editor's features may be implemented by ad hoc code or by a <a href="Formal_grammar" title="Formal grammar">formal grammar</a>. For example, language sensitivity in Emacs is implemented in the <a href="Lisp_(programming_language)" title="Lisp (programming language)">Lisp</a> definition of the edit mode for the given language. In contrast, language sensitivity in an <a href="XML_editor" title="XML editor">XML editor</a> is driven by a formal <a href="Document_Type_Definition" class="mw-redirect" title="Document Type Definition">DTD</a> schema for the given language.
</p><p>Although structured editors allow the viewing and manipulation of the underlying document in a structured manner, the file format in which the document is stored on disk may or may not be heavily structured and may or may not be open or standardized (e.g., plain text versus Microsoft Word documents).
</p><p>Structure editing has often been employed in <a href="Source_code_editor" class="mw-redirect" title="Source code editor">source code editors</a>, as source code is naturally structured by the syntax of the computer language. However, most source code editors are instead text editors with additional features such as <a href="Syntax_highlighting" title="Syntax highlighting">syntax highlighting</a> and <a href="Code_folding" title="Code folding">code folding</a>, rather than structure editors. The editors in some <a href="Integrated_development_environment" title="Integrated development environment">integrated development environments</a> parse the source code and generate a parse tree, allowing the same analysis as by a structure editor, but the actual editing of the source code is generally done as raw text.
</p><p>Each <a href="Programming_language" title="Programming language">programming language</a> typically has a well-defined syntax given by a <a href="Context-free_grammar" title="Context-free grammar">context-free grammar</a>, and accordingly the meaningful structural elements in <a href="Source_code" title="Source code">source code</a> written in the language correspond to the grammatical <a href="Phrases" class="mw-redirect" title="Phrases">phrases</a> in the text. Early syntax-directed source code editors included <a href="Interlisp-D" class="mw-redirect" title="Interlisp-D">Interlisp-D</a> (for <a href="Lisp_(programming_language)" title="Lisp (programming language)">Lisp</a>’s limited syntax) and Emily<sup id="cite_ref-hansen_1-0" class="reference"><a href="#cite_note-hansen-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> (for <a href="PL/I" title="PL/I">PL/I</a>’s rich syntax).
</p><p>A syntax-directed editor may treat grammar rules as <a href="Generative_grammar" title="Generative grammar">generative</a> (e.g., offering the user <a href="Template_(word_processing)" title="Template (word processing)">templates</a> that correspond to one or more steps in a formal derivation of program text) or proscriptive (e.g., preventing a phrase of a given <a href="Lexical_category" class="mw-redirect" title="Lexical category">part of speech</a> from being moved to a context where another part of speech is required) or analytic (e.g., parsing textual edits to create a structured representation). Structure editing features in source code editors make it harder to write programs with invalid syntax. Language-sensitive editors may impose syntactic correctness as an absolute requirement (e.g., as did Mentor<sup id="cite_ref-inria_2-0" class="reference"><a href="#cite_note-inria-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>), or may tolerate <a href="Syntax_error" title="Syntax error">syntax errors</a> after issuing a warning (e.g., as did the Cornell Program Synthesizer<sup id="cite_ref-TeitelbaumReps_3-0" class="reference"><a href="#cite_note-TeitelbaumReps-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>). Strict structured editors often make it difficult to perform edits that are easy to perform with plain text editors, which is one of the factors contributing to the lack of adoption of structured editing in some domains, such as source code editing.
</p><p>Some syntax-directed editors monitor compliance with the <a href="Context-sensitive_grammar" title="Context-sensitive grammar">context-sensitive</a> constraints of a language such as <a href="Type_systems" class="mw-redirect" title="Type systems">type correctness</a>. Such <a href="Compiler#Front_end" title="Compiler">static-semantic</a> constraints may be specified <a href="Imperative_programming" title="Imperative programming">imperatively</a> by actions (e.g., as in Gandalf<sup id="cite_ref-CMU_4-0" class="reference"><a href="#cite_note-CMU-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-CMU2_5-0" class="reference"><a href="#cite_note-CMU2-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-CMU3_6-0" class="reference"><a href="#cite_note-CMU3-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>), or <a href="Declarative_programming" title="Declarative programming">declaratively</a> by an <a href="Attribute_grammar" title="Attribute grammar">attribute grammar</a> (e.g., as in the Synthesizer Generator<sup id="cite_ref-Reps_7-0" class="reference"><a href="#cite_note-Reps-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-RepsTeitelbaum_8-0" class="reference"><a href="#cite_note-RepsTeitelbaum-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup>) or by unification in a many-sorted algebra (e.g., as in PSG <sup id="cite_ref-darmstadt_9-0" class="reference"><a href="#cite_note-darmstadt-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>) or a <a href="Logic_programming" title="Logic programming">logic program</a> (e.g., as in Centaur<sup id="cite_ref-inria2_10-0" class="reference"><a href="#cite_note-inria2-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> and Pan<sup id="cite_ref-berkeley_11-0" class="reference"><a href="#cite_note-berkeley-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>), with compliance checked by the underlying editing machinery. Structured editors vary in the degree to which they allow their users to perform edits that cause the document to become syntactically or semantically incorrect.
</p><p>It is common for a language sensitive editor to represent a document as a <a href="Parse_tree" title="Parse tree">parse tree</a> with respect to language's grammar, or as an <a href="Abstract_syntax_tree" title="Abstract syntax tree">abstract syntax tree</a> (AST). For example, a <a href="Document_object_model" class="mw-redirect" title="Document object model">DOM</a> tree is essentially an AST with respect to a given <a href="Document_Type_Definition" class="mw-redirect" title="Document Type Definition">DTD</a>. Frequently, the textual view of that underlying tree is generated by <a href="Prettyprinting" class="mw-redirect" title="Prettyprinting">prettyprinting</a> the underlying tree. Editors associated with intentional programming<sup id="cite_ref-IP_12-0" class="reference"><a href="#cite_note-IP-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup> and <a href="Language-oriented_programming" title="Language-oriented programming">language-oriented programming</a> for <a href="Programming_language" title="Programming language">general-purpose languages</a> and <a href="Domain-specific_languages" class="mw-redirect" title="Domain-specific languages">domain-specific languages</a> share many of the features of language-sensitive editors, but aim for greater separation between the underlying representation (the <a href="Intention" title="Intention">intention</a>) and the surface representation (text in a programming language).
</p>
<div class="mw-heading mw-heading2"><h2 id="Examples">Examples</h2></div>
<ul><li><a href="JetBrains_MPS" title="JetBrains MPS">JetBrains MPS</a></li>
<li><a href="Lapis_(text_editor)" title="Lapis (text editor)">Lapis (text editor)</a>: Editing Text with Lightweight Structure</li></ul>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Source_code_editor" class="mw-redirect" title="Source code editor">Source code editor</a></li>
<li><a href="Source_Code_in_Database" title="Source Code in Database">Source Code in Database</a></li>
<li><a href="Homoiconicity" title="Homoiconicity">Homoiconicity</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */
.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}
/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-hansen-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-hansen_1-0">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFHansen1971" class="citation conference cs1">Hansen, Wilfred J. (1971). "User engineering principles for interactive systems". <i>Proceedings of the Fall Joint Computer Conference FJCC 39</i>. AFIPS. pp. <span class="nowrap">5623–</span>532.</cite></span>
</li>
<li id="cite_note-inria-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-inria_2-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFDonzeau_GougeHuet,_G.Kahn,_G.Lang,_B.1980" class="citation conference cs1">Donzeau Gouge, V.; Huet, G.; Kahn, G.; Lang, B. (July 1980). <a rel="nofollow" class="external text" href="http://hal.archives-ouvertes.fr/docs/00/07/65/35/PDF/RR-0026.pdf">"Programming environments based on structured editors: The Mentor experience"</a> <span class="cs1-format">(PDF)</span>. <i><a href="INRIA" class="mw-redirect" title="INRIA">INRIA</a> Research report no. 26</i>.</cite></span>
</li>
<li id="cite_note-TeitelbaumReps-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-TeitelbaumReps_3-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFTeitelbaumT._Reps1981" class="citation journal cs1">Teitelbaum, T.; <a href="Thomas_W._Reps" title="Thomas W. Reps">T. Reps</a> (September 1981). <a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F358746.358755">"The Cornell Program Synthesizer: A syntax-directed programming environment"</a>. <i>Communications of the ACM</i>. <b>24</b> (9): <span class="nowrap">563–</span>573. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F358746.358755">10.1145/358746.358755</a></span>.</cite></span>
</li>
<li id="cite_note-CMU-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-CMU_4-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFHabermannNotkin,_David1986" class="citation journal cs1">Habermann, A. Nico; Notkin, David (1986). <a rel="nofollow" class="external text" href="http://www0.cs.ucl.ac.uk/staff/ucacwxe/lectures/GS04-0708/gandalf.pdf">"Gandalf: Software Development Environments"</a> <span class="cs1-format">(PDF)</span>. <i>IEEE Trans. Softw. Eng</i>. <b>12</b> (12): <span class="nowrap">1117–</span>1127. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1109%2FTSE.1986.6313007">10.1109/TSE.1986.6313007</a>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a> <a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:11474349">11474349</a>.</cite></span>
</li>
<li id="cite_note-CMU2-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-CMU2_5-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFMedina_Mora1982" class="citation book cs1">Medina Mora, Raul (1982). <i>Syntax-directed editing--towards integrating programming environments</i>. Pittsburgh, PA: Carnegie Mellon University (PhD Dissertation).</cite></span>
</li>
<li id="cite_note-CMU3-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-CMU3_6-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFKaiser1985" class="citation book cs1">Kaiser, Gail Elaine (1985). <i>Semantics for structure editing environments</i>. Pittsburgh, PA: Carnegie Mellon University (PhD Dissertation).</cite></span>
</li>
<li id="cite_note-Reps-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-Reps_7-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFReps,_T.1984" class="citation book cs1"><a href="Thomas_W._Reps" title="Thomas W. Reps">Reps, T.</a> (1984). <i>Generating Language-Based Environments</i>. Cambridge, MA: The M.I.T. Press. (Awarded the 1983 <a href="Association_for_Computing_Machinery" title="Association for Computing Machinery">ACM</a> Doctoral Dissertation Award.).</cite></span>
</li>
<li id="cite_note-RepsTeitelbaum-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-RepsTeitelbaum_8-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFReps,_Thomas_W.Teitelbaum,_Tim1988" class="citation book cs1"><a href="Thomas_W._Reps" title="Thomas W. Reps">Reps, Thomas W.</a>; Teitelbaum, Tim (1988). <i>The Synthesizer Generator: A System for Constructing Language-Based Editors</i>. Cambridge, MA: Springer-Verlag.</cite></span>
</li>
<li id="cite_note-darmstadt-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-darmstadt_9-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFSneltingHenhapl,_Wolfgang1986" class="citation conference cs1">Snelting, Gregor; Henhapl, Wolfgang (1986). "Unification in many-sorted algebras as a device for incremental semantic analysis". <i>Proceedings of the 13th ACM SIGACT-SIGPLAN symposium on Principles of programming languages (POPL)</i>. New York, NY: ACM Press. pp. <span class="nowrap">229–</span>235.</cite></span>
</li>
<li id="cite_note-inria2-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-inria2_10-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFBorrasClement,_D.Despeyrouz,_Th.Incerpi,_J.1989" class="citation conference cs1">Borras, P.; Clement, D.; Despeyrouz, Th.; Incerpi, J.; Kahn, G.; Lang, B.; Pascual, V. (1989). "CENTAUR: The System". <i>"Proceedings of the ACM SIGSOFT/SIGPLAN Software Engineering Symposium on Practical Software Development Environments (PSDE)</i>. Vol. 24. New York, NY: ACM Press. pp. <span class="nowrap">14–</span>24.</cite></span>
</li>
<li id="cite_note-berkeley-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-berkeley_11-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFBallanceGraham,_Susan_L.Van_De_Vanter,_Michael_L.1990" class="citation conference cs1">Ballance, Robert A.; Graham, Susan L.; Van De Vanter, Michael L. (1990). "Pan language-based editing system for integrated development". <i>SDE 4: Proceedings of the fourth ACM SIGSOFT symposium on Software development environments</i>. Irvine, CA: ACM Press. pp. <span class="nowrap">77–</span>93.</cite></span>
</li>
<li id="cite_note-IP-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-IP_12-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFCzarnecki,_KrzysztofEisenecker,_Ulrich2000" class="citation book cs1">Czarnecki, Krzysztof & Eisenecker, Ulrich (June 2000). <i>Generative Programming: Methods, Tools, and Applications, Chapter 11 (Intentional Programming)</i>. Reading, MA: Addison-Wesley.</cite></span>
</li>
</ol></div></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-02-24" href="https://en.wikipedia.org/wiki/?title=Structure_editor&oldid=1277331974">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>